# @Time :  
# @Author : Fioman 
# @Phone : 13149920693
"""
什么是像素:
图像中的最小单元,表示图像的颜色或者是灰度信息.
RGB图像: 每个像素由红,绿,篮三种颜色组成,每种颜色的值通常在0~255之间.
灰度图像: 每个像素只有一个灰度值,表示黑白强度或者是亮暗程度,值范围是0~255之间.
              0表示黑色,255表示白色
在Opencv中使用Numpy数组来表示和操作图像.访问像素值
image[x,y] # x和y表示像素所在的x和y坐标,注意图像坐标系,图像原点在图像的左上角,下标从0开始.

索引截图:
image[yStart:yEnd,xStart:xEnd]
前面是高度,也就是y坐标的范围
后面是宽度,也就是x坐标的范围

像素访问的另外一种方式,就是通过item和itemset,但是item和itemset有局限性
1) item和itemset 操作彩色图像的时候只能单通道的去操作
2) item和itemset 操作灰度图像的时候只需要提供索引即可

"""
import os.path

import cv2

import settings

imagePath = os.path.join(settings.IMAGE_PATH, "lena.jpg")
imageColor = cv2.imread(imagePath, cv2.IMREAD_COLOR)
cv2.imshow("Original", imageColor)
cv2.waitKey(0)


def is_equal_color(color1, color2):
    """
    比较两个BGR颜色的值是否相等
    :param color1:
    :param color2:
    :return:
    """
    assert len(color1) == len(color2)
    for i in range(len(color1)):
        if color2[i] != color1[i]:
            return False
    else:
        return True


# 访问像素值为红色的,将红色的改成黑色
colorRed = (127, 137, 224)
colorRedCount = 0
for x in range(imageColor.shape[:2][1]):
    for y in range(imageColor.shape[:2][0]):
        if is_equal_color(imageColor[x, y], colorRed):
            colorRedCount += 1
            imageColor[x, y] = (0, 0, 0)
print("ColorRedCount: ", colorRedCount)

cv2.imshow("NewImage", imageColor)
cv2.waitKey(0)

# 截取这个图像的中心部位,然后截取宽和高的各自一半
height, width = imageColor.shape[:2]
print("width = {},height = {}".format(width, height))
yStart = height // 2 - height // 4
yEnd = height // 2 + height // 4
xStart = width // 2 - width // 4
xEnd = width // 2 + width // 4
print("{} , {} , {}, {}".format(yStart, yEnd, xStart, xEnd))
imageRoi = imageColor[yStart:yEnd, xStart:xEnd]
cv2.imshow("ImageRoi", imageRoi)
cv2.waitKey(0)

# 像素访问的另外一种方式itemset 和 item

blue = imageColor.item(50, 100, 0)
green = imageColor.item(50, 100, 1)
red = imageColor.item(50, 100, 2)

print("B: {},G: {},R: {}, BGR = {}".format(blue, green, red, imageColor[50, 100]))

# 重新赋值,然后再访问
imageColor.itemset((50, 100, 0), 255)
imageColor.itemset((50, 100, 1), 0)
imageColor.itemset((50, 100, 2), 0)
blue = imageColor.item(50, 100, 0)
green = imageColor.item(50, 100, 1)
red = imageColor.item(50, 100, 2)
print("B: {},G:{},R:{} ,BGR = {}".format(blue, green, red, imageColor[50, 100]))

# 如果是灰度图像
imageGray = cv2.cvtColor(imageColor, cv2.COLOR_BGR2GRAY)
itemVal = imageGray[50, 100]
print("itemVal = {}, itemVal02 = {}".format(itemVal, imageGray[50, 100]))
imageGray.itemset(50, 100, 255)
itemVal = imageGray[50, 100]
print("itemVal = {}, itemVal02 = {}".format(itemVal, imageGray[50, 100]))
